home *** CD-ROM | disk | FTP | other *** search
/ ADA Programming Guide / ADA Programming Guide.iso / adasmall / merge.ada < prev    next >
Text File  |  1996-01-30  |  3KB  |  115 lines

  1. with SMALL_SP; use SMALL_SP;
  2. procedure MERGE is
  3.  
  4.    STIME : FLOAT;
  5.    CH    : CHARACTER;
  6.  
  7.    procedure SCREEN(X,Y : in INTEGER; C, C2 : in CHARACTER) is
  8.    begin
  9.             CURSORAT(X-1,Y);
  10.             PUT(C2);
  11.             CURSORAT(X,Y);
  12.             PUT(C);
  13.             CURSORAT(X-1,Y);
  14.             PUT(" ");
  15.    end SCREEN;
  16.  
  17.    procedure MERGE_SORT is
  18.  
  19.     TYPE VECTOR IS STRING(0..25);
  20.     V         : VECTOR;
  21.     TEMPARRAY : VECTOR;
  22.     MAX       : INTEGER;
  23.     CURLENGTH : INTEGER;
  24.     M         : INTEGER;
  25.     LEFT      : INTEGER;
  26.     TOPLEFT   : INTEGER;
  27.     RIGHT     : INTEGER;
  28.     TOPRIGHT  : INTEGER;
  29.  
  30.     C2        : STRING(0..2);
  31.  
  32.     TEMP      : CHARACTER;
  33.     I,J       : INTEGER;
  34.     ROW       : INTEGER;
  35.  
  36.    begin
  37.        V := "ZYXWVUTSRQPONMLKJIHGFEDCBA";
  38.        C2:= " RL";
  39.        MAX := 25;
  40.        ROW := 3;
  41.        for k in 0..25 loop
  42.         SCREEN(ROW,14+k,V(k),C2(0));
  43.        end loop;
  44.        delay STIME - CLOCK;
  45.        CURLENGTH := 1;
  46.        WHILE CURLENGTH < MAX LOOP -- NEW PHASE
  47.             CURSORAT(ROW,55); PUT("CURLENGTH:"); PUT(CURLENGTH);
  48.             TEMPARRAY := V;
  49.             CURSORAT(ROW+3,1); PUT("Temp: ");
  50.             for k in 0..25 loop
  51.                 SCREEN(ROW+3,14+k,TEMPARRAY(K),C2(0));
  52.             end loop;
  53.  
  54.             LEFT := 1;
  55.             M := 1;
  56.             WHILE LEFT <= MAX LOOP -- FIND PAIR OF SUBARRAYS
  57.                 RIGHT := LEFT + CURLENGTH;
  58.                 TOPLEFT := RIGHT;
  59.                 IF TOPLEFT > MAX THEN
  60.                         TOPLEFT := MAX + 1;
  61.                 END IF;
  62.                 TOPRIGHT := RIGHT + CURLENGTH;
  63.                 IF TOPRIGHT > MAX THEN
  64.                         TOPRIGHT := MAX + 1;
  65.                 END IF;
  66.                 -- MERGE SUBARRAYS
  67.                 -- GO UNTIL ONE SUBARRAY RUNS OUT
  68.                 WHILE (LEFT < TOPLEFT) AND (RIGHT < TOPRIGHT) LOOP
  69.                         IF TEMPARRAY(LEFT) <= TEMPARRAY(RIGHT) THEN
  70.                                 V(M)  := TEMPARRAY(LEFT);
  71.                                 SCREEN(3,14+M,V(M),C2(1));
  72.                                 LEFT  := LEFT + 1;
  73.                         ELSE
  74.                                 V(M)  := TEMPARRAY(RIGHT);
  75.                                 SCREEN(3,14+M,V(M),C2(2));
  76.                                 RIGHT := RIGHT + 1;
  77.                         END IF;
  78.                         M := M + 1;
  79.                 END LOOP;
  80.                 -- NOW "COPY TAIL" OF WHICHEVER SUBARRAY REMAINS
  81.                 WHILE LEFT < TOPLEFT LOOP
  82.                         V(M) := TEMPARRAY(LEFT);
  83.                         SCREEN(3,14+M,V(M),C2(1));
  84.                         M    := M + 1;
  85.                         LEFT := LEFT + 1;
  86.                 END LOOP;
  87.                 WHILE RIGHT < TOPRIGHT LOOP
  88.                         V(M)  := TEMPARRAY(RIGHT);
  89.                         SCREEN(3,14+M,V(M),C2(2));
  90.                         RIGHT := RIGHT + 1;
  91.                         M     := M + 1;
  92.                 END LOOP;
  93.                 LEFT := TOPRIGHT;
  94.             END LOOP;
  95.             -- NOW DOUBLE SIZE OF SUBARRAYS
  96.             -- AND GO BACK FOR NEXT PHASE
  97.  
  98.             CURLENGTH := CURLENGTH * 2;
  99.        END LOOP;
  100.    end MERGE_SORT;
  101.  
  102.  
  103. begin
  104.  
  105.   CURSORAT(3,1); PUT("Merge:");
  106.  
  107.   STIME := CLOCK + 10.0;
  108.  
  109.   MERGE_SORT;
  110.  
  111.   CURSORAT(15,1); PUT("PRESS ENTER TO RETURN TO THE EDITOR...");
  112.   GET_LINE(CH);
  113.  
  114. end MERGE;
  115.